﻿using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using LiveTiss.Classes;
using System.Linq;
using LiveTiss.LiveTissWCF;
using LiveTiss.Guias;
using LiveTiss.Schemas;

namespace LiveTiss.Telas
{
    public partial class MenuScreen : UserControl
    {
        #region Listas Dados

        //public ObservableCollection<LiveTiss.Classes.TreeViewNode> listaTreeViewNodes
        //{
        //    get { return (ObservableCollection<LiveTiss.Classes.TreeViewNode>)GetValue(listaTreeViewNodesProperty); }
        //    set { SetValue(listaTreeViewNodesProperty, value); }
        //}

        //public static readonly DependencyProperty listaTreeViewNodesProperty =
        //    DependencyProperty.Register("listaTreeViewNodes", typeof(ObservableCollection<LiveTiss.Classes.TreeViewNode>), typeof(MenuScreen), new PropertyMetadata(null));

        ObservableCollection<Operadora> listaOperadoras { set; get; }



        #endregion

        #region TreeView

        public ObservableCollection<LiveTissWCF.TreeViewRoot> treeViewDataList
        {
            get { return (ObservableCollection<LiveTissWCF.TreeViewRoot>)GetValue(treeViewDataListProperty); }
            set { SetValue(treeViewDataListProperty, value); }
        }

        public static readonly DependencyProperty treeViewDataListProperty =
            DependencyProperty.Register("treeViewDataList", typeof(ObservableCollection<LiveTissWCF.TreeViewRoot>), typeof(MenuScreen), new PropertyMetadata(null));

        private TreeViewTipoGuia selectedTipoGuia = null;
        private IntervaloLote intervaloLote = null;

        #endregion

        #region Guia Selecionada

        private TreeViewNode NodeSelecionado = null;

        #endregion

        #region WebService Members

        LiveTissWCF.LiveTissServiceClient client = new LiveTissWCF.LiveTissServiceClient();

        protected void InitializeWebServiceCallBack()
        {
            client.OperadoraGetAllCompleted += new System.EventHandler<LiveTissWCF.OperadoraGetAllCompletedEventArgs>(client_OperadoraGetAllCompleted);
            client.OperadoraGetByIdCompleted += new System.EventHandler<LiveTissWCF.OperadoraGetByIdCompletedEventArgs>(client_OperadoraGetByIdCompleted);
            client.OperadoraPrestadorGetAllCompleted += new System.EventHandler<LiveTissWCF.OperadoraPrestadorGetAllCompletedEventArgs>(client_OperadoraPrestadorGetAllCompleted);
            client.TreeViewGetAllCompleted+=new System.EventHandler<TreeViewGetAllCompletedEventArgs>(client_TreeViewGetAllCompleted);
            
            client.IntervaloLoteGetByRegistroANSCompleted += new System.EventHandler<IntervaloLoteGetByRegistroANSCompletedEventArgs>(client_IntervaloLoteGetByRegistroANSCompleted);
            client.IntervaloLoteUpdateCompleted += new System.EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_IntervaloLoteUpdateCompleted);
            
            client.LoteGuiaInsertCompleted += new System.EventHandler<LoteGuiaInsertCompletedEventArgs>(client_LoteGuiaInsertCompleted);

        }

        protected void client_TreeViewGetAllCompleted(object sender, TreeViewGetAllCompletedEventArgs e)
        {
            if (e.Result != null)
            {
                this.treeViewDataList = e.Result;
                bsyTreeView.IsBusy = false;
            }
        }

        protected void client_OperadoraGetAllCompleted(object sender, LiveTissWCF.OperadoraGetAllCompletedEventArgs e)
        {
            if (e.Result != null)
            {
                this.listaOperadoras = new ObservableCollection<Operadora>(e.Result);

                this.client.OperadoraPrestadorGetAllAsync(Classes.Util.Token);
            }
        }

        protected void client_OperadoraGetByIdCompleted(object sender, LiveTissWCF.OperadoraGetByIdCompletedEventArgs e)
        {

        }

        protected void client_OperadoraPrestadorGetAllCompleted(object sender, LiveTissWCF.OperadoraPrestadorGetAllCompletedEventArgs e)
        {
            //Realiza os filtros para criar a estrutura basica do treeView
            if (e.Result != null)
            {
                //ObservableCollection<OperadoraPrestador> result = new ObservableCollection<OperadoraPrestador>(e.Result);

                //var operadorasFiliadas = new ObservableCollection<LiveTiss.Classes.TreeViewNode>(
                //                         from operadoraPrestador in result
                //                         join operadora in listaOperadoras on
                //                             operadoraPrestador.RegistroANS equals operadora.RegistroANS
                //                         where operadoraPrestador.IDPrestador == Util.Login.ID
                //                         select new LiveTiss.Classes.TreeViewNode
                //                         {
                //                             Nome = operadora.Nome,
                //                             RegistroANS = operadora.RegistroANS,
                //                             CodigoNaOperadora = operadoraPrestador.CodigoNaOperadora,
                //                             ID = operadoraPrestador.ID
                //                         });

                //if (operadorasFiliadas.Count() > 0)
                //{
                //    for (int i = 0; i < operadorasFiliadas.Count; i++)
                //    {
                //        operadorasFiliadas[i].listaGuias = new ObservableCollection<string>();

                //        for (int tipoGuia = (int)TipoGuia.Consulta;
                //                tipoGuia <= (int)TipoGuia.Solicitação_Odontologia; tipoGuia++)
                //        {
                //            operadorasFiliadas[i].listaGuias.Add(((TipoGuia)tipoGuia).ToString());
                //        }
                //    }
                //}

                //this.listaTreeViewNodes = new ObservableCollection<LiveTiss.Classes.TreeViewNode>(operadorasFiliadas.ToList());
            }
        }

        void client_IntervaloLoteGetByRegistroANSCompleted(object sender, IntervaloLoteGetByRegistroANSCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // exception
            }
            else if (selectedTipoGuia != null && e.Result != null)
            {
                if (e.Result.Count > 0)
                {
                    intervaloLote = null;

                    foreach (var item in e.Result)
                    {
                        //Verifica se o intervalo encontrado é válido
                        if (item.Atual < item.Fim)
                        {
                            intervaloLote = item;
                            break;
                        }
                    }

                    if (intervaloLote != null)
                    {
                        LoteGuia novoLote = new LoteGuia()
                        {
                            IDOperadoraPrestador = intervaloLote.IDOperadoraPrestador,
                            NumeroLote = (++intervaloLote.Atual).ToString(),
                            TipoGuia = selectedTipoGuia.TipoGuia
                        };

                        // Cadastrar lote
                        client.LoteGuiaInsertAsync(Util.Token, novoLote);
                    }
                    else
                    {
                        var alert = new AlertChildWindow();

                        alert.Title = "O intervalo de lotes cadastrados para esta Operadora está esgotado." +
                            " Por favor, cadastre um novo intervalo no menu Configuração.";
                        alert.Width = 700;
                        alert.Height = 300;

                        alert.Show();
                    }
                }
                else
                {
                    var alert = new AlertChildWindow();

                    alert.Title = "Não existe intervalo de lotes cadastrado para esta operadora!";
                    alert.Width = 600;
                    alert.Height = 190;

                    alert.Show();
                }
            }
        }

        void client_LoteGuiaInsertCompleted(object sender, LoteGuiaInsertCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // exception
            }
            else if (selectedTipoGuia != null && e.Result > 0 && intervaloLote != null)
            {
                // Atualizar intervalo lote
                client.IntervaloLoteUpdateAsync(Util.Token, intervaloLote);
            }
        }

        void client_IntervaloLoteUpdateCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // exception
            }
            else
            {
                selectedTipoGuia = null;
                intervaloLote = null;

                this.LoadData();
            }
        }

        #endregion

        #region Constructors

        public MenuScreen()
        {
            this.DataContext = this;
            InitializeComponent();

            if (Classes.Util.Token == null)
            {
                App.SwitchControl(new LoginScreen());
            }
            else
            {
                txtUserName.Text = Classes.Util.Login.Usuario;

                this.InitializeWebServiceCallBack();
                this.LoadData();
            }
        }

        #endregion

        #region Other Methods

        protected void LoadData()
        {
            NodeSelecionado = null;
            grdGuia.Visibility = System.Windows.Visibility.Collapsed;

            bsyTreeView.IsBusy = true;
            client.TreeViewGetAllAsync(Classes.Util.Token);
        }

        #endregion

        #region UI Members

        private void btnSair_Click(object sender, RoutedEventArgs e)
        {
            Classes.Util.Token = null;
            App.SwitchControl(new LoginScreen());
        }

        private void btnConfig_Click(object sender, RoutedEventArgs e)
        {
            var window = new ConfigChildWindow();

            window.Show();
        }

        private void MenuTipoGuia_Click(object sender, RoutedEventArgs e)
        {
            var item = (sender as FrameworkElement).DataContext as TreeViewTipoGuia;

            switch (item.TipoGuia)
            {
                case TipoGuia.Consulta:
                case TipoGuia.SP_SADT:
                case TipoGuia.Resumo_Internação:
                case TipoGuia.Honorário_Individual:
                case TipoGuia.Odontologia:
                case TipoGuia.Consulta_Reapresentação:
                case TipoGuia.SP_SADT_Reapresentação:
                case TipoGuia.Resumo_Internação_Reapresentação:
                case TipoGuia.Honorário_Individual_Reapresentação:
                case TipoGuia.Odontologia_Reapresentação:
                    // Verifica se existe intervalo lote para essa operadora
                    selectedTipoGuia = item;
                    client.IntervaloLoteGetByRegistroANSAsync(Util.Token, item.RegistroANS);
                    break;
                case TipoGuia.Solicitação_Internação:
                case TipoGuia.Solicitação_Prorrogação:
                case TipoGuia.Solicitação_SADT:
                case TipoGuia.Solicitação_Odontologia:
                    // Cadastra solicitacao
                    ChildWindowNumeroGuia window = new ChildWindowNumeroGuia(item);

                    window.Closed += new System.EventHandler(window_Closed);
                    window.Show();
                    break;
            }
        }

        private void ReloadTreeView_Click(object sender, RoutedEventArgs e)
        {
            this.LoadData();
        }

        private void MenuCriaGuiaFaturamento_Click(object sender, RoutedEventArgs e)
        {
            var item = (sender as FrameworkElement).DataContext as TreeViewNodeLote;

            ChildWindowNumeroGuia window = new ChildWindowNumeroGuia(item);

            window.Closed += new System.EventHandler(window_Closed);
            window.Show();
        }

        void window_Closed(object sender, System.EventArgs e)
        {
            if ((sender as ChildWindow).DialogResult.Value)
            {
                LoadData();
            }
        }

        private void MenuGuiaAbrir_Click(object sender, RoutedEventArgs e)
        {
            var item = (sender as FrameworkElement).DataContext as TreeViewNode;

            this.NodeSelecionado = item;
            grdGuia.Visibility = System.Windows.Visibility.Visible;

            svwGuia.Content = null;

            UserControl uc = null;
            switch (item.Tipo)
            {
                case TipoGuia.Consulta:
                    var guiaConsulta = new GuiaConsulta();
                    var itemConsulta = item as TreeViewNodeFaturamento;

                    var _guiaConsulta = guiaConsulta.Value;

                    _guiaConsulta.identificacaoGuia.numeroGuiaPrestador = itemConsulta.Guia.NumeroGuia;
                    _guiaConsulta.identificacaoGuia.LogoPrestadora = itemConsulta.Operadora.Logo;

                    guiaConsulta.Value = _guiaConsulta;

                    uc = guiaConsulta;
                    break;
                case TipoGuia.SP_SADT:
                    var guiaSP_SADT = new GuiaSP_SADT();
                    var itemSP_SADT = item as TreeViewNodeFaturamento;

                    var _guiaSP_SADT = guiaSP_SADT.Guia;

                    _guiaSP_SADT.identificacaoGuiaSADTSP.numeroGuiaPrestador = itemSP_SADT.Guia.NumeroGuia;
                    _guiaSP_SADT.identificacaoGuiaSADTSP.LogoPrestadora = itemSP_SADT.Operadora.Logo;
                    
                    guiaSP_SADT.Guia = _guiaSP_SADT;

                    uc = guiaSP_SADT;
                    break;
                case TipoGuia.Resumo_Internação:
                    var guiaResumoInternacao = new GuiaResumoInternacao();
                    var itemResumoInternacao = item as TreeViewNodeFaturamento;

                    var _guiaResumoInternacao = guiaResumoInternacao.Guia;

                    _guiaResumoInternacao.identificacaoGuiaInternacao.numeroGuiaPrestador = itemResumoInternacao.Guia.NumeroGuia;
                    _guiaResumoInternacao.identificacaoGuiaInternacao.LogoPrestadora = itemResumoInternacao.Operadora.Logo;

                    guiaResumoInternacao.Guia = _guiaResumoInternacao;

                    uc = guiaResumoInternacao;
                    break;
                case TipoGuia.Honorário_Individual:
                    var guiaHonorarioIndividual = new GuiaHonorarioIndividual();
                    var itemHonorarioIndividual = item as TreeViewNodeFaturamento;

                    var _guiaHonorarioIndividual = guiaHonorarioIndividual.Guia;

                    _guiaHonorarioIndividual.identificacaoGuiaHonorarioIndividual.numeroGuiaPrestador = itemHonorarioIndividual.Guia.NumeroGuia;
                    _guiaHonorarioIndividual.identificacaoGuiaHonorarioIndividual.LogoPrestadora = itemHonorarioIndividual.Operadora.Logo;

                    guiaHonorarioIndividual.Guia = _guiaHonorarioIndividual;

                    uc = guiaHonorarioIndividual;
                    break;
                case TipoGuia.Odontologia:
                    var guiaOdontologia = new GuiaOdontologia();
                    var itemGuiaOdonotologia = item as TreeViewNodeFaturamento;

                    var _guiaOdontologia = guiaOdontologia.Guia;

                    _guiaOdontologia.cabecalhoGuia.numeroGuiaPrestador = itemGuiaOdonotologia.Guia.NumeroGuia;
                    _guiaOdontologia.cabecalhoGuia.LogoPrestadora = itemGuiaOdonotologia.Operadora.Logo;

                    guiaOdontologia.Guia = _guiaOdontologia;

                    uc = guiaOdontologia;
                    break;
                case TipoGuia.Consulta_Reapresentação:
                    var guiaConsultaReapresentacao = new GuiaConsultaReapresentacao();
                    var itemGuiaConsultaReapresentacao = item as TreeViewNodeFaturamento;

                    var _guiaConsultaReapresentacao = guiaConsultaReapresentacao.Value;

                    _guiaConsultaReapresentacao.identificacaoGuia.numeroGuiaPrestador = itemGuiaConsultaReapresentacao.Guia.NumeroGuia;
                    _guiaConsultaReapresentacao.identificacaoGuia.LogoPrestadora = itemGuiaConsultaReapresentacao.Operadora.Logo;

                    guiaConsultaReapresentacao.Value = _guiaConsultaReapresentacao;

                    uc = guiaConsultaReapresentacao;
                    break;
                case TipoGuia.SP_SADT_Reapresentação:
                    var guiaSP_SADTReapresentacao = new GuiaSP_SADTReapresentacao();
                    var itemGuiaSP_SADTReapresentacao = item as TreeViewNodeFaturamento;

                    var _guiaSP_SADTReapresentacao = guiaSP_SADTReapresentacao.Guia;

                    _guiaSP_SADTReapresentacao.identificacaoGuiaSADTSP.numeroGuiaPrestador = itemGuiaSP_SADTReapresentacao.Guia.NumeroGuia;
                    _guiaSP_SADTReapresentacao.identificacaoGuiaSADTSP.LogoPrestadora = itemGuiaSP_SADTReapresentacao.Operadora.Logo;

                    guiaSP_SADTReapresentacao.Guia = _guiaSP_SADTReapresentacao;

                    uc = guiaSP_SADTReapresentacao;
                    break;
                case TipoGuia.Resumo_Internação_Reapresentação:
                    var guiaResumoInternacaoReapresentacao = new GuiaResumoInternacaoReapresentacao();
                    var itemResumoInternacaoReapresentacao = item as TreeViewNodeFaturamento;

                    var _guiaResumoInternacaoReapresentacao = guiaResumoInternacaoReapresentacao.Guia;

                    _guiaResumoInternacaoReapresentacao.identificacaoGuiaInternacao.numeroGuiaPrestador = itemResumoInternacaoReapresentacao.Guia.NumeroGuia;
                    _guiaResumoInternacaoReapresentacao.identificacaoGuiaInternacao.LogoPrestadora = itemResumoInternacaoReapresentacao.Operadora.Logo;

                    guiaResumoInternacaoReapresentacao.Guia = _guiaResumoInternacaoReapresentacao;

                    uc = guiaResumoInternacaoReapresentacao;
                    break;
                case TipoGuia.Honorário_Individual_Reapresentação:
                    var guiaHonorarioIndividualReapresentacao = new GuiaHonorarioIndividualReapresentacao();
                    var itemHonorarioIndividualReapresentacao = item as TreeViewNodeFaturamento;

                    var _guiaHonorarioIndividualReapresentacao = guiaHonorarioIndividualReapresentacao.Guia;

                    _guiaHonorarioIndividualReapresentacao.identificacaoGuiaHonorarioIndividual.numeroGuiaPrestador = itemHonorarioIndividualReapresentacao.Guia.NumeroGuia;
                    _guiaHonorarioIndividualReapresentacao.identificacaoGuiaHonorarioIndividual.LogoPrestadora = itemHonorarioIndividualReapresentacao.Operadora.Logo;

                    guiaHonorarioIndividualReapresentacao.Guia = _guiaHonorarioIndividualReapresentacao;

                    uc = guiaHonorarioIndividualReapresentacao;
                    break;
                case TipoGuia.Odontologia_Reapresentação:
                    var guiaOdontologiaReapresentacao = new GuiaOdontologiaReapresentada();
                    var itemOdontologiaReapresentacao = item as TreeViewNodeFaturamento;

                    var _guiaOdontologiaReapresentacao = guiaOdontologiaReapresentacao.Guia;

                    _guiaOdontologiaReapresentacao.cabecalhoGuia.numeroGuiaPrestador = itemOdontologiaReapresentacao.Guia.NumeroGuia;
                    _guiaOdontologiaReapresentacao.cabecalhoGuia.LogoPrestadora = itemOdontologiaReapresentacao.Operadora.Logo;

                    guiaOdontologiaReapresentacao.Guia = _guiaOdontologiaReapresentacao;

                    uc = guiaOdontologiaReapresentacao;
                    break;
                case TipoGuia.Solicitação_Internação:
                    var guiaSolicInternacao = new GuiaSolicInternacao();
                    var itemSolicInternacao = item as TreeViewNodeSolicitacao;

                    var _guiaSolicInternacao = guiaSolicInternacao.Guia;

                    _guiaSolicInternacao.identificacaoGuiaSolicitacaoInternacao.numeroGuiaPrestador = itemSolicInternacao.Guia.NumeroGuia;
                    _guiaSolicInternacao.identificacaoGuiaSolicitacaoInternacao.LogoPrestadora = itemSolicInternacao.Operadora.Logo;

                    guiaSolicInternacao.Guia = _guiaSolicInternacao;

                    uc = guiaSolicInternacao;
                    break;
                case TipoGuia.Solicitação_Prorrogação:
                    var guiaSolicitacaoProrrogacao = new GuiaSolicitacaoProrrogacao();
                    var itemSolicitacaoProrrogacao = item as TreeViewNodeSolicitacao;

                    var _guiaSolicitacaoProrrogacao = guiaSolicitacaoProrrogacao.Guia;

                    _guiaSolicitacaoProrrogacao.identificacaoProrrogacao.numeroGuiaPrestador = itemSolicitacaoProrrogacao.Guia.NumeroGuia;
                    _guiaSolicitacaoProrrogacao.identificacaoProrrogacao.LogoPrestadora = itemSolicitacaoProrrogacao.Operadora.Logo;

                    guiaSolicitacaoProrrogacao.Guia = _guiaSolicitacaoProrrogacao;

                    uc = guiaSolicitacaoProrrogacao;
                    break;
                case TipoGuia.Solicitação_SADT:
                    var guiaSolicitação_SADT = new GuiaSolicitacaoSP_SADT();
                    var itemSolicitação_SADT = item as TreeViewNodeSolicitacao;

                    var _guiaSolicitação_SADT = guiaSolicitação_SADT.Guia;

                    _guiaSolicitação_SADT.identificacaoGuiaSolicitacaoSADTSP.numeroGuiaPrestador = itemSolicitação_SADT.Guia.NumeroGuia;
                    _guiaSolicitação_SADT.identificacaoGuiaSolicitacaoSADTSP.LogoPrestadora = itemSolicitação_SADT.Operadora.Logo;

                    guiaSolicitação_SADT.Guia = _guiaSolicitação_SADT;

                    uc = guiaSolicitação_SADT;
                    break;
                case TipoGuia.Solicitação_Odontologia:
                    var guiaOdontoSolicitacao = new GuiaSolicitacaoOdonto();
                    var itemOdontoSolicitacao = item as TreeViewNodeSolicitacao;

                    var _guiaOdontoSolicitacao = guiaOdontoSolicitacao.Guia;

                    _guiaOdontoSolicitacao.cabecalhoGuia.numeroGuiaPrestador = itemOdontoSolicitacao.Guia.NumeroGuia;
                    _guiaOdontoSolicitacao.cabecalhoGuia.LogoPrestadora = itemOdontoSolicitacao.Operadora.Logo;

                    guiaOdontoSolicitacao.Guia = _guiaOdontoSolicitacao;

                    uc = guiaOdontoSolicitacao;
                    break;
            }
            svwGuia.Content = uc;
        }

        private void btnGuiaSalvar_Click(object sender, RoutedEventArgs e)
        {

        }

        private void btnGuiaFechar_Click(object sender, RoutedEventArgs e)
        {
            NodeSelecionado = null;
            grdGuia.Visibility = System.Windows.Visibility.Collapsed;
        }

        #endregion
    }
}
